/**
 * 
 */
package parser;

import java.util.HashMap;
import java.util.Map;

/**
 * Eine nette Idee. Sie hat nur einen Haken: Jedes TagDB muss einen eigenen
 * Namen haben. Das kann bei den 51XX-Felder schnell ausufern. Daher ist
 * eine anonyme, z.T. maschinell erzeugte Liste besser.
 * 
 * @author baumann
 *
 */
@Deprecated
public enum TagEnum {

	QUELLE_UND_DATUM_DER_ERSTERFASSUNG(
			new String[] { "001", "001A" },
			"008",
			Repeatability.NON_REPEATABLE,
			"Quelle und Datum der Ersterfassung",
			"Fixed-Length Data Elements"),
	QUELLE_UND_DATUM_DER_LETZTEN_ÄNDERUNG(
			"002",
			"001B",
			"005",
			Repeatability.NON_REPEATABLE,
			"Quelle und Datum der letzten Änderung",
			"Date and Time of Latest Transaction"),
	QUELLE_UND_DATUM_DER_LETZTEN_STATUSVERGABE(
			"003",
			"001D",
			null,
			Repeatability.NON_REPEATABLE,
			"Quelle und Datum der letzten Statusvergabe",
			""),
	SATZART(
			"005",
			"002@",
			"008; 079",
			Repeatability.NON_REPEATABLE,
			"Satzart",
			"Fixed-Length Data Elements"),
	GND_IDENTIFIER(
			"006",
			"003U",
			"024",
			Repeatability.REPEATABLE,
			"GND-Identifier",
			"Other Standard Identifier"),
	ENTITÄTENCODIERUNG(
			"008",
			"004B",
			"079",
			Repeatability.NON_REPEATABLE,
			"Entitätencodierung",
			""),
	ÄNDERUNGSCODIERUNG(
			"010",
			"008@",
			"Leader",
			Repeatability.NON_REPEATABLE,
			"Änderungscodierung",
			""),
	TEILBESTANDSKENNZEICHEN(
			"011",
			"008A",
			"079",
			Repeatability.NON_REPEATABLE,
			"Teilbestandskennzeichen",
			""),
	NUTZUNGSKENNZEICHEN(
			"012",
			"008B",
			"079",
			Repeatability.NON_REPEATABLE,
			"Nutzungskennzeichen",
			""),
	SWD_NR_IM_GKD_SATZ(
			"023",
			"007W",
			null,
			Repeatability.REPEATABLE,
			"SWD-Nr. im GKD-Satz",
			""),
	SONSTIGE_STANDARDNUMMERN(
			"024",
			"006Y",
			"024",
			Repeatability.REPEATABLE,
			"Sonstige Standardnummern",
			"Other Standard Identifier"),
	GKD_NR_IM_SWD_SATZ(
			"028",
			"007R",
			null,
			Repeatability.REPEATABLE,
			"GKD-Nr. im SWD-Satz",
			""),
	GEOGRAFISCHE_KOORDINATEN(
			"034",
			"037H",
			"034",
			Repeatability.REPEATABLE,
			"Geografische Koordinaten",
			"Coded Cartographic Mathematical Data"),
	GND_NUMMER(
			"035",
			"007K",
			"035",
			Repeatability.NON_REPEATABLE,
			"GND-Nummer",
			"System Control Number"),
	ALTE_NORMNUMMER(
			"039",
			"007N",
			"035",
			Repeatability.REPEATABLE,
			"Alte Normnummer",
			"System Control Number"),
	LÄNDERCODE_NACH_ISO_3166(
			"043",
			"042B",
			"043",
			Repeatability.NON_REPEATABLE,
			"Ländercode nach ISO 3166",
			"Geographic Area Code"),
	GND_SYSTEMATIK(
			"065",
			"042A",
			"065",
			Repeatability.NON_REPEATABLE,
			"GND Systematik",
			"Other Classification Number"),
	DDC_NOTATION(
			"083",
			"037G",
			"083",
			Repeatability.REPEATABLE,
			"DDC-Notation",
			"Dewey Decimal Classificaton Number"),
	VERALTETE_DDC_NOTATION(
			"089",
			"037I",
			"089",
			Repeatability.REPEATABLE,
			"Veraltete DDC-Notation",
			""),
	PERSON_BEVORZUGTER_NAME(
			"100",
			"028A",
			"100",
			Repeatability.NON_REPEATABLE,
			"Person – Bevorzugter Name",
			"Heading - Personal Name"),
	KÖRPERSCHAFT_BEVORZUGTER_NAME(
			"110",
			"029A",
			"110",
			Repeatability.NON_REPEATABLE,
			"Körperschaft – Bevorzugter Name",
			"Heading - Corporate Name"),
	KONGRESS_BEVORZUGTER_NAME(
			"111",
			"030A",
			"111",
			Repeatability.NON_REPEATABLE,
			"Kongress – Bevorzugter Name",
			"Heading - Meeting Name"),
	EINHEITSTITEL_BEVORZUGTER_NAME(
			"130",
			"022A",
			"130",
			Repeatability.NON_REPEATABLE,
			"Einheitstitel – Bevorzugter Name",
			"Heading - Uniform Title"),
	ZEIT_148(
			"148",
			"060A",
			"148",
			Repeatability.NON_REPEATABLE,
			"Zeit  - wird nicht verwendet",
			"Heading - Chronological Term"),
	SACHBEGRIFF_BEVORZUGTE_BENENNUNG(
			"150",
			"041A",
			"150",
			Repeatability.NON_REPEATABLE,
			"Sachbegriff – Bevorzugte Benennung",
			"Heading - Topical Term"),
	GEOGRAFIKUM_BEVORZUGTER_NAME(
			"151",
			"065A",
			"151",
			Repeatability.NON_REPEATABLE,
			"Geografikum – Bevorzugter Name",
			"Heading - Geographic Name"),
	MARKIERUNG_FÜR_DAS_MATCH_UND_MERGE__VERFAHREN(
			"169",
			"038L",
			null,
			Repeatability.NON_REPEATABLE,
			"Markierung für das Match-und-Merge- Verfahren",
			""),
	ZU_VERKNÜPFENDE_SCHLAGWÖRTER_IN_HINWEISSÄTZEN(
			"260",
			"041O",
			"260",
			Repeatability.REPEATABLE,
			"Zu verknüpfende Schlagwörter in Hinweissätzen",
			"Complex See Reference"),
	INHALTSTYP(
			"336",
			"032L",
			"336",
			Repeatability.REPEATABLE,
			"Inhaltstyp",
			"Content Type"),
	MEDIENTYP("337", "032M", "339", Repeatability.REPEATABLE, "Medientyp", ""),
	DATENTRÄGERTYP(
			"338",
			"032N",
			"339",
			Repeatability.REPEATABLE,
			"Datenträgertyp",
			""),
	TÄTIGKEITSBEREICH(
			"372",
			"032Q",
			"372",
			Repeatability.REPEATABLE,
			"Tätigkeitsbereich",
			"Field of Activity"),
	GESCHLECHTSANGABE(
			"375",
			"032T",
			"375",
			Repeatability.NON_REPEATABLE,
			"Geschlechtsangabe",
			"Gender"),
	SPRACHENCODE_NACH_ISO_639_2_B(
			"377",
			"042C",
			"377",
			Repeatability.NON_REPEATABLE,
			"Sprachencode nach ISO 639-2/B",
			"Associated Language"),
	FORM_DES_WERKS(
			"380",
			"032W",
			"380",
			Repeatability.REPEATABLE,
			"Form des Werks",
			"Form of work"),
	BESETZUNG_IM_MUSIKBEREICH(
			"382",
			"032X",
			"382",
			Repeatability.NON_REPEATABLE,
			"Besetzung im Musikbereich",
			"Medium of Performance"),
	NUMERISCHE_KENNZEICHNUNG_EINES_MUSIKWERKS(
			"383",
			"032Y",
			"383",
			Repeatability.REPEATABLE,
			"Numerische Kennzeichnung eines Musikwerks",
			"Numeric Designation of Musical Work"),
	TONART("384", "032Z", "384", Repeatability.NON_REPEATABLE, "Tonart", "Key"),
	PERSON_ABWEICHENDER_NAME(
			"400",
			"028@",
			"400",
			Repeatability.REPEATABLE,
			"Person – Abweichender Name",
			"See From Tracing - Personal Name"),
	KÖRPERSCHAFT_ABWEICHENDER_NAME(
			"410",
			"029@",
			"410",
			Repeatability.REPEATABLE,
			"Körperschaft – Abweichender Name",
			"See From Tracing - Corporate Name"),
	KONGRESS_ABWEICHENDER_NAME(
			"411",
			"030@",
			"411",
			Repeatability.REPEATABLE,
			"Kongress – Abweichender Name",
			"See From Tracing - Meeting Name"),
	TITEL_ABWEICHENDER_NAME(
			"430",
			"022@",
			"430",
			Repeatability.REPEATABLE,
			"Titel – Abweichender Name",
			"See From Tracing - Uniform Title"),
	ZEIT(
			"448",
			"060@",
			"448",
			Repeatability.UNKNOWN,
			"Zeit",
			"See From Tracing - Chronological Term"),
	SACHBEGRIFF_ABWEICHENDE_BENENNUNG(
			"450",
			"041@",
			"450",
			Repeatability.REPEATABLE,
			"Sachbegriff – Abweichende Benennung",
			"See From Tracing - Topical Term"),
	GEOGRAFIKUM_ABWEICHENDER_NAME(
			"451",
			"065@",
			"451",
			Repeatability.REPEATABLE,
			"Geografikum – Abweichender Name",
			"See From Tracing - Geographic Name"),
	PERSON_BEZIEHUNG(
			"500",
			"028R",
			"500",
			Repeatability.REPEATABLE,
			"Person – Beziehung",
			"See Also From Tracing - Personal Name"),
	KÖRPERSCHAFT_BEZIEHUNG(
			"510",
			"029R",
			"510",
			Repeatability.REPEATABLE,
			"Körperschaft – Beziehung",
			"See Also From Tracing - Corporate Name"),
	KONGRESS_BEZIEHUNG(
			"511",
			"030R",
			"511",
			Repeatability.REPEATABLE,
			"Kongress – Beziehung",
			"See Also From Tracing - Meeting Name"),
	EINHEITSTITEL_BEZIEHUNG(
			"530",
			"022R",
			"530",
			Repeatability.REPEATABLE,
			"Einheitstitel – Beziehung",
			"See Also From Tracing - Uniform Title"),
	ZEIT_BEZIEHUNG(
			"548",
			"060R",
			"548",
			Repeatability.REPEATABLE,
			"Zeit – Beziehung",
			"See Also From Tracing - Chronological Term"),
	SACHBEGRIFF_BEZIEHUNG(
			"550",
			"041R",
			"550",
			Repeatability.REPEATABLE,
			"Sachbegriff – Beziehung",
			"See Also From Tracing - Topical Term"),
	GEOGRAFIKUM_BEZIEHUNG(
			"551",
			"065R",
			"551",
			Repeatability.REPEATABLE,
			"Geografikum – Beziehung",
			"See Also From Tracing - Geographic Name"),
	REDAKTIONELLE_BEMERKUNGEN(
			"667",
			"050C",
			"667",
			Repeatability.REPEATABLE,
			"Redaktionelle Bemerkungen",
			"Nonpublic General Note"),
	QUELLENANGABEN(
			"670",
			"050E",
			"670",
			Repeatability.REPEATABLE,
			"Quellenangaben",
			"Source Data Found"),
	NEGATIV_EINGESEHENE_QUELLEN(
			"675",
			"050F",
			"675",
			Repeatability.NON_REPEATABLE,
			"Negativ eingesehene Quellen",
			"Source Data Not Found"),
	BIOGRAFISCHE_HISTORISCHE_ANGABEN(
			"678",
			"050G",
			"678",
			Repeatability.REPEATABLE,
			"Biografische/historische Angaben",
			"Biographical or Historical Data"),
	DEFINITIONEN(
			"679",
			"050H",
			"679",
			Repeatability.REPEATABLE,
			"Definitionen",
			""),
	BENUTZUNGSHINWEISE(
			"680",
			"050D",
			"680",
			Repeatability.REPEATABLE,
			"Benutzungshinweise",
			"Public General Note"),
	NUMMER_UND_BEVORZUGTER_NAME_BZW_BEVORZUGTE_BENENNUNG_DES_ZIELSATZES_BEI_UMLENKUNG_VON_DATENSÄTZEN(
			"682",
			"039I",
			"682",
			Repeatability.NON_REPEATABLE,
			"Nummer und bevorzugter Name bzw. bevorzugte Benennung des "
				+ "Zielsatzes bei Umlenkung von Datensätzen",
			"Deleted Heading Information"),
	NUMMER_UND_BEVORZUGTER_NAME_BZW_BEVORZUGTE_BENENNUNG_DES_ZIELSATZES_BEI_AUFSPALTUNG_VON_DATENSÄTZEN(
			"689",
			"039G",
			"682",
			Repeatability.NON_REPEATABLE,
			"Nummer und bevorzugter Name bzw. bevorzugte Benennung des "
				+ "Zielsatzes bei Aufspaltung von Datensätzen",
			"Deleted Heading Information"),
	TITELANGABEN(
			"692",
			"046G",
			"692",
			Repeatability.REPEATABLE,
			"Titelangaben",
			""),
	PERSON_BEVORZUGTER_NAME_IN_EINEM_ANDEREN_DATENBESTAND(
			"700",
			"028P",
			"700",
			Repeatability.REPEATABLE,
			"Person – Bevorzugter Name in einem anderen Datenbestand",
			"Established Heading Linking Entry - Personal Name"),
	KÖRPERSCHAFT_BEVORZUGTER_NAME_IN_EINEM_ANDEREN_DATENBESTAND(
			"710",
			"029P",
			"710",
			Repeatability.REPEATABLE,
			"Körperschaft – Bevorzugter Name in einem anderen Datenbestand",
			"Established Heading Linking Entry - Corporate Name"),
	KONGRESS_BEVORZUGTER_NAME_IN_EINEM_ANDEREN_DATENBESTAND(
			"711",
			"030P",
			"711",
			Repeatability.REPEATABLE,
			"Kongress – Bevorzugter Name in einem anderen Datenbestand",
			"Established Heading Linking Entry - Meeting Name"),
	EINHEITSTITEL_BEVORZUGTER_NAME_IN_EINEM_ANDEREN_DATENBESTAND(
			"730",
			"022P",
			"730",
			Repeatability.REPEATABLE,
			"Einheitstitel – Bevorzugter Name in einem anderen Datenbestand",
			"Established Heading Linking Entry - Uniform Title"),
	SACHBEGRIFF_BEVORZUGTE_BENENNUNG_IN_EINEM_ANDEREN_DATENBESTAND(
			"750",
			"041P",
			"750",
			Repeatability.REPEATABLE,
			"Sachbegriff – Bevorzugte Benennung in einem anderen Datenbestand",
			"Established Heading Linking Entry - Topical Term"),
	GEOGRAFIKUM_BEVORZUGTER_NAME_IN_EINEM_ANDEREN_DATENBESTAND(
			"751",
			"065P",
			"751",
			Repeatability.REPEATABLE,
			"Geografikum – Bevorzugter Name in einem anderen Datenbestand",
			"Established Heading Linking Entry - Geographic Name"),
	INTERNE_IDENTIFIKATIONSNUMMER_PPN(
			"797",
			"003@",
			"001; 003",
			Repeatability.NON_REPEATABLE,
			"Interne Identifikationsnummer PPN",
			"Control Number (Identifier)"),
	MAILBOX("901", "047A/01", "912", Repeatability.REPEATABLE, "Mailbox", ""),
	KATALOGISIERENDE_INSTITUTION(
			"903",
			"047A/03",
			"040",
			Repeatability.REPEATABLE,
			"Katalogisierende Institution",
			"Cataloging Source"),
	ALTE_ANSETZUNGSFORM(
			"913",
			"047C",
			"913",
			Repeatability.UNKNOWN,
			"Alte Ansetzungsform",
			""),
	SORTIERNAME_IM_DEUTSCHEN_EXILARCHIV(
			"980",
			"070A/00",
			null,
			Repeatability.NON_REPEATABLE,
			"Sortiername im Deutschen Exilarchiv",
			""),
	FEHLERMELDUNGEN(
			"999",
			"070B/09",
			null,
			Repeatability.NON_REPEATABLE,
			"Fehlermeldungen",
			"");

	private TagEnum(
			final String pica3,
			final String picaPlus,
			final String marc,
			final Repeatability repeatability,
			final String german,
			final String english) {

		this.pica3 = pica3;
		this.picaPlus = picaPlus;
		this.marc = marc;
		this.repeatability = repeatability;
		this.german = german;
		this.english = english;
	}

	private TagEnum(
			final String[] picaTags,
			final String marc,
			final Repeatability repeatability,
			final String german,
			final String english) {

		this.pica3 = picaTags[0];
		this.picaPlus = picaTags[1];
		this.marc = marc;
		this.repeatability = repeatability;
		this.german = german;
		this.english = english;
	}

	public final String pica3;
	public final String picaPlus;
	public final String marc;
	public final String german;
	public final String english;
	public final Repeatability repeatability;

	private static Map<String, TagEnum> database = null;

	/**
	 * Findet einen TagEnum zu einer Pica- oder Pica+ Feldkennzeichnung.
	 * 
	 * @param tag 	Pica- oder Pica+ Feldkennzeichnung nicht null, nicht leer.
	 * 				Kann Leerzeichen vorne oder hinten enthalten.
	 * @return	Gültiger TagEnum oder null.
	 */
	public static TagEnum findTag(final String tag) {
		if (tag == null)
			throw new IllegalArgumentException("tag ist null");
		String tagStr = tag.trim();
		if (tagStr.length() == 0)
			throw new IllegalArgumentException("tag enthält keinen Text");

		// erstmal initialisieren:
		if (database == null) {
			database =
				new HashMap<String, TagEnum>(TagEnum.values().length * 2);
			for (TagEnum singleTag : TagEnum.values()) {
				database.put(singleTag.pica3, singleTag);
				database.put(singleTag.picaPlus, singleTag);
			}
		}

		// Jetzt suchen:
		return database.get(tagStr);

	}

	public static void main(String[] args) {
		for (TagEnum enum1 : TagEnum.values()) {
			System.out.print("newTag = new Tag(\"");
			System.out.print(enum1.pica3);
			System.out.print("\", \"");
			System.out.print(enum1.picaPlus);
			System.out.print("\", \"");
			System.out.print(enum1.german);
			System.out.print("\", ");
			System.out.print(enum1.repeatability);
			System.out.print(", \"");
			System.out.print(enum1.marc);
			System.out.print("\", \"");
			System.out.print(enum1.english);
			System.out.println("\");");
			System.out.println("addTag(newTag);");
		}
	}

}
